#pragma once

#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <string>

// /dev/null文件：相当于不能恢复的垃圾桶
const std::string nullfile = "/dev/null";

void Daemon(const std::string &cwd = "")
{
    // 1. 忽略其他信号
    signal(SIGCLD,SIG_IGN);
    signal(SIGPIPE,SIG_IGN);
    signal(SIGSTOP,SIG_IGN);

    // 2. 把自己变成独立的会话
    if(fork() > 0)
        exit(0);
    // 创建一个会话并将该进程的GID(组id)设置为会话id
    setsid();

    // 3. 更改当前调用进程的工作目录
    if(!cwd.empty())
        chdir(cwd.c_str());

    // 4. 标准输入、标准输出、标准错误重定向到/dev/null
    int fd = open(nullfile.c_str(),O_RDWR);
    if(fd > 0)
    {
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);

        close(fd);
    }
}